package com.xiepei.day01;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * 第8课：Map 进阶（LinkedHashMap + TreeMap）
 *
 * 目标：
 * 1. 复习 HashMap，再理解 LinkedHashMap 保序、TreeMap 排序。
 * 2. 学会挑选合适的 Map 实现：无序 / 插入顺序 / 排序。
 * 3. 通过示例感受 LRU 缓存雏形、排行榜等典型场景。
 */
public class Lesson08_Map进阶 {

    public static void main(String[] args) {
        linkedHashMapDemo();
        System.out.println();
        treeMapDemo();
        System.out.println();
        chooseMapHint();
    }

    /**
     * LinkedHashMap 保留插入顺序，可用于“访问记录”“LRU 缓存”。
     */
    private static void linkedHashMapDemo() {
        System.out.println("=== LinkedHashMap：保留插入顺序 ===");
        Map<String, Integer> orderMap = new LinkedHashMap<>();
        orderMap.put("第一单", 101);
        orderMap.put("第二单", 102);
        orderMap.put("第三单", 103);

        System.out.println("插入顺序输出：" + orderMap); // {第一单=101, 第二单=102, 第三单=103}

        // 模拟访问记录
        orderMap.get("第一单");
        orderMap.put("第四单", 104);
        System.out.println("继续插入后：" + orderMap); // 顺序仍是插入先后

        // 如果想做 LRU，可以用 accessOrder=true 的构造函数，这里先了解
        LinkedHashMap<String, Integer> lru = new LinkedHashMap<>(16, 0.75f, true);
        lru.put("A", 1);
        lru.put("B", 2);
        lru.put("C", 3);
        lru.get("A"); // 访问A，使其移动到末尾
        lru.put("D", 4);
        System.out.println("accessOrder=true 输出：" + lru); // {B=2, C=3, A=1, D=4}
    }

    /**
     * TreeMap 自动按 key 排序，适合做排行榜、区间查询。
     */
    private static void treeMapDemo() {
        System.out.println("=== TreeMap：按 key 排序 ===");
        TreeMap<String, Integer> scoreMap = new TreeMap<>();
        scoreMap.put("David", 88);
        scoreMap.put("Alice", 95);
        scoreMap.put("Bob", 90);

        System.out.println("按字母排序输出：" + scoreMap); // {Alice=95, Bob=90, David=88}

        System.out.println("第一个 entry：" + scoreMap.firstEntry()); // Alice=95
        System.out.println("最后一个 entry：" + scoreMap.lastEntry()); // David=88
        System.out.println("比 Bob 小的所有 entry：" + scoreMap.headMap("Bob")); // {Alice=95}
        System.out.println("从 Bob（含）到结尾：" + scoreMap.tailMap("Bob")); // {Bob=90, David=88}
    }

    /**
     * 选型提示，帮助记忆。
     */
    private static void chooseMapHint() {
        System.out.println("=== Map 实现选型提示 ===");
        System.out.println("HashMap：最快，顺序不重要 -> 用它（默认）");
        System.out.println("LinkedHashMap：要保留插入顺序或实现 LRU -> 用它");
        System.out.println("TreeMap：要自动排序 / 做区间查询 -> 用它");
    }
}


